package com.cn.codebrush.leetcode.editor.cn;
// 2022-11-10 10:56:52
// 16  最接近的三数之和
//给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数，使它们的和与 target 最接近。 
//
// 返回这三个数的和。 
//
// 假定每组输入只存在恰好一个解。 
//
// 
//
// 示例 1： 
//
// 
//输入：nums = [-1,2,1,-4], target = 1
//输出：2
//解释：与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
// 
//
// 示例 2： 
//
// 
//输入：nums = [0,0,0], target = 1
//输出：0
// 
//
// 
//
// 提示： 
//
// 
// 3 <= nums.length <= 1000 
// -1000 <= nums[i] <= 1000 
// -104 <= target <= 104 
// 
// Related Topics 数组 双指针 排序 
// 👍 1285 👎 0


import java.util.Arrays;

public class ThreeSumClosest{

public static void main(String[] args) {

Solution solution = new ThreeSumClosest().new Solution();
    int[] nums = {1,1,1,0};
    int target = -100;
    System.out.println(solution.threeSumClosest(nums,target));
}

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int n = nums.length;
        Arrays.sort(nums);
        int resSum = Integer.MAX_VALUE;
        int k2 = Integer.MAX_VALUE;
        for(int i=0;i<n-2;i++){
            int l = i+1;
            int r = n-1;
            while(l < r){
                int sum = nums[i]+nums[l]+nums[r];
                int k1 = Math.abs(sum-target);

                if(k1 < k2){
                    k2 =k1;
                    resSum = sum;
                }
                if(sum>target){
                    r--;
                }else if(sum < target){
                    l++;
                }else {
                    return target;
                }

            }
        }

        return resSum;
    }
}
//leetcode submit region end(Prohibit modification and deletion)


}